package myou.model;

import java.util.Iterator;

import myou.classes.Usuario;
/**
 * Projeto Myou - Disciplina: Sistemas de Informação I
 * Classe que executa a interface com o usuário (MyouUI)
 * @author Ronycley Gonçalves Agra
 * @version 1.00
 * @since Milestone 2 17/10/2011
 * Interface Gerente que provê os metodos que executam a
 * ação enviada pela pelo usuário através do contralador para o 
 * módulo "Usuários"
 */
public class ModuloUsuarios extends Modulo {

	private static ModuloUsuarios instance = null;
	private Repositorio repositorio = null;
	
	/**
	 * Método que retorna uma instancia única da classe
	 * @return Gerente Retorna um Gerente de acordo com o módulo especificado
	 * @throws Exception
	 */
	public synchronized static Modulo getInstance() throws Exception{
		try{
			if(instance == null){
				instance = new ModuloUsuarios();
			}
			return instance;
		}catch(Exception e){
			throw new Exception(e.getMessage());
		}
	}
	
	/**
	 * Retorna
	 * @return the repositorio
	 */
	public Repositorio getRepositorio() {
		return repositorio;
	}

	/**
	 * Cria usuários no sistema
	 * 
	 * @param login
	 *            O login do usuário
	 * @param nome
	 *            O nome do usuário
	 * @param endereco
	 *            O endereço do usuário
	 * @throws Exception
	 *             Lança exceção caso o nome ou login sejam nulos ou brancos ou
	 *             já exista algum usuário com o login informado,
	 */
	public void criarUsuario(String login, String nome, String endereco)
			throws Exception {
		if (login == null || login.equals("")) {
			throw new Exception("Login inválido");
		}
		if (nome == null || nome.equals("")) {
			throw new Exception("Nome inválido");
		}
		if(this.getRepositorio().existe(login)){
			throw new Exception("Já existe um usuário com este login");
		}
		/*
		Iterator<Usuario> it = this.usuarios.iterator();
		while (it.hasNext()) {
			Usuario usuario = it.next();
			if (usuario.getLogin().equals(login)) {
				throw new Exception("Já existe um usuário com este login");
			}
		}
		*/
		Usuario usuario = new Usuario(login, nome, endereco);
		this.getRepositorio().adicionar(usuario);
		//this.usuarios.add(usuario);
		//this.mapaEmprestimos.put(usuario.getLogin(), new Integer(0));
	}
	
	/**
	 * Retorna o valor do atributo de um usuário
	 * 
	 * @param login
	 *            O login do usuário
	 * @param atributo
	 *            O atributo desejado
	 * @return O valor do atributo
	 * @throws Exception
	 *             Lança exceção caso o login ou atributo sejam nulos ou
	 *             brancos, não exista o usuário com o login informado ou o
	 *             atributo seja inválido
	 */
	public String getAtributoUsuario(String login, String atributo)
			throws Exception {
		if (login == null || login.equals("")) {
			throw new Exception("Login inválido");
		}
		if (atributo == null || atributo.equals("")) {
			throw new Exception("Atributo inválido");
		}
		Iterator<Usuario> it = this.usuarios.iterator();
		while (it.hasNext()) {
			Usuario usuario = it.next();
			if (usuario.getLogin().equals(login)) {
				if (atributo.equals("nome")) {
					return usuario.getNome();
				} else if (atributo.equals("endereco")) {
					return usuario.getEndereco();
				} else {
					throw new Exception("Atributo inexistente");
				}
			}
		}
		throw new Exception("Usuário inexistente");
	}
	
	/**
	 * Localiza um usuário no sistema
	 * 
	 * @param idSessao
	 *            O id da sessão atual
	 * @param chave
	 *            A chave a ser pesquisada
	 * @param atributo
	 *            O atributo a ser pesquisado
	 * @return O nome do usuário com o seu endereço
	 * @throws Exception
	 *             Lança exceção caso o id da sessão, a chave ou atributo sejam
	 *             nulos ou brancos, não exista a sessão com o id informado ou o
	 *             atributo seja inexistente
	 */
	public String localizarUsuario(String idSessao, String chave,
			String atributo) throws Exception {
		if (idSessao == null || idSessao.equals("")) {
			throw new Exception("Sessão inválida");
		}
		if (chave == null || chave.equals("")) {
			throw new Exception("Palavra-chave inválida");
		}
		if (atributo == null || atributo.equals("")) {
			throw new Exception("Atributo inválido");
		}
		if (this.existeSessao(idSessao)) {
			Usuario usuarioSessao = this.localizarSessao(idSessao).getUsuario();
			String nomes = null;
			Iterator<Usuario> it = this.usuarios.iterator();
			while (it.hasNext()) {
				Usuario usuario = it.next();
				if (!usuario.equals(usuarioSessao)) {

					String valorStr = "";
					if (atributo.equals("nome")) {
						valorStr = usuario.getNome();
					} else if (atributo.equals("endereco")) {
						valorStr = usuario.getEndereco();
					} else {
						throw new Exception("Atributo inexistente");
					}
					if (valorStr.contains(chave)) {
						if (nomes == null) {
							nomes = usuario.getNome() + " - "
									+ usuario.getEndereco();
						} else {
							nomes = nomes + "; "+ usuario.getNome() + " - "
									+ usuario.getEndereco();
						}
					}
				}
			}
			if (nomes != null) {
				return nomes;
			} else {
				return "Nenhum usuário encontrado";
			}
		} else {
			throw new Exception("Sessão inexistente");
		}
	}
	
	/**
	 * Verifica se dois usuários já são amigos
	 * 
	 * @param idSessao
	 *            O id da sessão que contem o primeiro usuário
	 * @param login
	 *            O login do segundo usuário
	 * @return "True" caso os usuários já sejam amigos ou "False" caso contrário
	 * @throws Exception
	 *             Lança exceção caso o id da sessão ou o login seja nulo ou
	 *             branco, não exista a sessão com o id informado ou não exista
	 *             usuário com o login informado.
	 */
	public String ehAmigo(String idSessao, String login) throws Exception {
		if (idSessao == null || idSessao.equals("")) {
			throw new Exception("Sessão inválida");
		}
		if (login == null || login.equals("")) {
			throw new Exception("Login inválido");
		}
		if (this.existeSessao(idSessao)) {
			Usuario usuarioSessao = this.localizarSessao(idSessao).getUsuario();
			Usuario usuarioTeste = this.getUsuario(login);
			if (usuarioTeste == null) {
				throw new Exception("Usuário inexistente");
			}
			if (usuarioSessao.getAmigos().contains(usuarioTeste)) {
				return "true";
			} else {
				return "false";
			}
		} else {
			throw new Exception("Sessão inexistente");
		}
	}

}
